#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Globales.h"
#include "TParser.h"
#include "Token.h"

int TParser_Crear(TParser* p) {
  int iError = 0;
  strcpy(p->m_szCaracteresValidos, " 0.123456789,:{}[]qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM\"");
  iError = TLexico_Crear(&(p->m_xAnalizadorLexico));
  if (iError == 0) {
    iError = TSintactico_Crear(&(p->m_xAnalizadorSintactico));
    if (iError == 0) {
      iError = TLexico_setAnalizadorSintactico(&(p->m_xAnalizadorLexico), &(p->m_xAnalizadorSintactico));
    }
  }
  return iError;
}

int TParser_PushChar(TParser* p, char c) {
  int iError = 0;
  eBoolean bCaracterInvalido = ebFalse;
  if ((int)c != 10) {                     /* Esto lo hago para que no pase los ENTERS. */
    bCaracterInvalido = febValidar(p, c);
    if (bCaracterInvalido == ebTrue) {
      iError = 201;
      p->m_iUltimoError = 201;
      strcpy(p->m_szUltimoError, "Caracter invalido.\n");
    } else {
      iError = TLexico_PushChar(&(p->m_xAnalizadorLexico), c);
    }
  }
  return iError;
}

int TParser_terminarFlujo(TParser* p) {
  int iError = 0;
  return iError;
}

int TParser_getUltimoError(TParser* p, int* codigo, char* mensaje) {
  int iError = 0;
  *codigo = p->m_iUltimoError;
  strcpy(mensaje, p->m_szUltimoError);
  return iError;
}

eBoolean febValidar(TParser* p, char c) {
  int iLen;
  int i;
  eBoolean ebCaracterInvalido = ebTrue;
  iLen = strlen(p->m_szCaracteresValidos);
  for (i = 0; i < iLen; i++) {
    if (c == p->m_szCaracteresValidos[i]) {
      ebCaracterInvalido = ebFalse;
      i = iLen;
    };
  };
  return ebCaracterInvalido;
}
